package Lambda表达式和匿名内部类的区别;

public class LambdaDemo {
    public static void main(String[] args) {
        //匿名内部类调用方法时方法形参可以是接口，抽象类，具体类
//        useInter(new Inter() {
//            @Override
//            public void show() {
//                System.out.println("接口");
//            }
//        });
//        useAnimal(new Animal() {
//            @Override
//            public void method() {
//                System.out.println("抽象类");
//            }
//        });
//        useStudent(new Student(){
//            public void study(){
//                System.out.println("具体类");
//            }
//        });

        //匿名内部类编译之后会产生单独的.class文件，Lambda不会有，在运行时动态生成
        useInter(new Inter() {
            @Override
            public void show() {
                System.out.println("接口");
            }
        });

        //Lambda表达式
//        useInter(()->{
//            System.out.println("接口");
//        });
//        useAnimal((Animal a)->{
//            System.out.println("抽象类");
//        });//抽象类不能用Lambda调用
//        useStudent(()-> System.out.println("具体类"));//必须是接口

        //接口中有两个抽象方法  用匿名内部类
//        useInter(new Inter() {
//            @Override
//            public void show() {
//                System.out.println("接口一");
//            }
//            public void method(){
//                System.out.println("接口二");
//            }
//        });


    }
    private static void useStudent(Student s){
        s.study();
    }

    private static void useAnimal(Animal a){
        a.method();
    }

    private static void useInter(Inter i){
        i.show();
    }
}
